package com.sky.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

/**
 * Spring Task 定时任务工具类
 */
@Slf4j
@Component  //交给IOC容器管理
public class SpringTaskScheduled {


    /**********************************************************************************************
     *                                                                                            *
     *                        管理端服务访问量少，所以定时任务放在管理端服务执行                             *
     *                        本项目是单体架构，所用定时任务用的 Spring Task
     *                        生产推荐使用 Quartz、Xxl-Job、Elastic-Job等定时任务工具
     *                                                                                            *
     **********************************************************************************************/



    @Resource
    private OrderTask orderTask;






    /**
     * 定时任务
     *        处理超时未支付订单
     */
    //@Async(value = "taskExecutor")           //使用自定义线程池线程异步执行定时任务
    //@Scheduled(cron = "0 0/10 * ? * ?")      //每隔10分钟的第0秒开始执行
    public void processTimeOutOrders(){
        log.info("--定时任务-处理--超时未支付订单--");
        orderTask.processTimeOutOrder();
        log.info("--定时任务-超时未支付订单--处理完毕--");
    }


    /**
     * 定时任务
     *        处理店铺打烊后，下单时间超过2h的派送中订单
     */
    @Async(value = "taskExecutor")            //使用自定义线程池线程异步执行定时任务
    @Scheduled(cron = "0 0 0/2 ? * ?")        //每隔2小时的第0分0秒执行
    public void processDeliveryOrders(){
        log.info("--定时任务-处理-店铺打烊，下单时间超过2h还在派送中订单--");
        orderTask.processDeliveryOrder();
        log.info("--定时任务-店铺打烊，下单时间超过2h派送中订单-处理完毕--");
    }





    /**
     * 测试具体定时任务
     */
    //@Async(value = "taskExecutor")
    //@Scheduled(cron = "0/5 * * * * ?")
    public void testScheduled(){
        System.out.println("定时任务执行，当前系统时间:" + new Date());
        log.info("当前线程名称: {}", Thread.currentThread().getName());
    }


}
